"""
单元测试运行脚本

运行所有核心算法的单元测试：
- 密码哈希函数
- JWT生成函数
- 简历解析函数
- Redis缓存函数

使用方法：
python tests/run_tests.py
"""

import unittest
import sys
import os

# 添加项目根目录到Python路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))


def run_all_tests():
    """运行所有测试"""
    # 检查依赖

    # 发现所有测试
    loader = unittest.TestLoader()
    suite = unittest.TestSuite()

    # 添加各个测试模块
    test_modules = [
        "tests.test_auth",
        "tests.test_resume_parser",
        "tests.test_redis_client",
    ]

    for module_name in test_modules:
        try:
            module = __import__(module_name, fromlist=[""])
            test_suite = loader.loadTestsFromModule(module)
            suite.addTest(test_suite)
            print(f"✅ 已加载测试模块: {module_name}")
        except ImportError as e:
            print(f"❌ 无法加载测试模块 {module_name}: {e}")
        except Exception as e:
            print(f"⚠️  加载测试模块 {module_name} 时出错: {e}")

    # 运行测试
    print("\n" + "=" * 60)
    print("🚀 开始运行单元测试")
    print("=" * 60)

    runner = unittest.TextTestRunner(
        verbosity=2, stream=sys.stdout, descriptions=True, buffer=False
    )

    result = runner.run(suite)

    # 输出测试结果摘要
    print("\n" + "=" * 60)
    print("📊 测试结果摘要")
    print("=" * 60)
    print(f"运行测试总数: {result.testsRun}")
    print(f"失败测试数: {len(result.failures)}")
    print(f"错误测试数: {len(result.errors)}")
    print(f"跳过测试数: {len(result.skipped)}")

    if result.wasSuccessful():
        print("✅ 所有测试通过！")
        return 0
    else:
        print("❌ 部分测试失败！")

        # 显示失败详情
        if result.failures:
            print("\n失败的测试:")
            for test, traceback in result.failures:
                print(f"  - {test}")

        if result.errors:
            print("\n出错的测试:")
            for test, traceback in result.errors:
                print(f"  - {test}")

        return 1


def run_specific_test(test_name):
    """运行指定的测试"""
    print(f"运行指定的测试: {test_name}")

    try:
        if test_name == "auth":
            import tests.test_auth as test_module
        elif test_name == "resume":
            import tests.test_resume_parser as test_module
        elif test_name == "redis":
            import tests.test_redis_client as test_module
        else:
            print(f"未知的测试名称: {test_name}")
            print("可用的测试: auth, resume, redis")
            return 1

        loader = unittest.TestLoader()
        suite = loader.loadTestsFromModule(test_module)
        runner = unittest.TextTestRunner(verbosity=2)
        result = runner.run(suite)

        return 0 if result.wasSuccessful() else 1

    except ImportError as e:
        print(f"导入测试模块失败: {e}")
        return 1
    except Exception as e:
        print(f"运行测试时出错: {e}")
        return 1


def show_help():
    """显示帮助信息"""
    print("""
智面系统单元测试运行器

用法:
    python tests/run_tests.py                 # 运行所有测试
    python tests/run_tests.py <test_name>     # 运行指定测试

可用测试:
    auth      - 认证相关测试（密码哈希、JWT）
    resume    - 简历解析测试
    redis     - Redis缓存测试

测试覆盖的核心算法:
    ✅ 密码哈希函数: get_password_hash(), verify_password()
    ✅ JWT生成函数: create_access_token()
    ✅ 简历解析函数: ResumeParser.parse_resume()
    ✅ Redis缓存函数: ChatHistoryCache 各个方法

示例:
    python tests/run_tests.py
    python tests/run_tests.py auth
    """)


if __name__ == "__main__":
    if len(sys.argv) > 1:
        if sys.argv[1] in ["-h", "--help", "help"]:
            show_help()
            sys.exit(0)
        elif sys.argv[1] in ["auth", "resume", "redis"]:
            exit_code = run_specific_test(sys.argv[1])
            sys.exit(exit_code)
        else:
            print(f"未知参数: {sys.argv[1]}")
            show_help()
            sys.exit(1)
    else:
        exit_code = run_all_tests()
        sys.exit(exit_code)
